package util;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

/**
 * JDBC工具类，用于数据库连接和操作
 */
public class JDBCUtil {
    private Connection connection;
    Properties prop = new Properties();
    InputStream input = null;

    /**
     * 获取数据库连接
     * @return String 返回null（当前方法返回类型待优化）
     */
    public String getconnection() {

        // 本地开发环境数据库配置示例
        // String url = "jdbc:mysql://localhost:3306/user";
        // String username = "root";
        // String password = "123456";

        try {
            // 从 properties 中获取数据库连接信息
           input = JDBCUtil.class.getClassLoader().getResourceAsStream("util/jdbc.properties");
          prop.load(input);

            String url = prop.getProperty("url");
            String username = prop.getProperty("username");
            String password = prop.getProperty("password");

            // 加载数据库驱动程序
            Class.forName("com.mysql.cj.jdbc.Driver");
            System.out.println("驱动连接成功！");
            System.out.println("连接成功！");
            if(connection==null||connection.isClosed()) {
                connection = DriverManager.getConnection(url, username, password);
                return null;
            }

        } catch (ClassNotFoundException | SQLException | IOException e ) {
            System.out.println("连接失败！");
            throw new RuntimeException(e);
        }
        return null;
    }

    /**
     * 执行更新操作（INSERT, UPDATE, DELETE）
     * @param sql SQL语句
     * @param params 参数值
     * @return boolean 操作是否成功
     */
    public boolean update(String sql, Object... params) {
        getconnection();
        try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
            // 设置参数
            for (int i = 0; i < params.length; i++) {
                preparedStatement.setObject(i + 1, params[i]);
            }
            // 执行更新操作
            int rowsAffected = preparedStatement.executeUpdate();
            return rowsAffected > 0; // 返回更新行数是否大于0，表示更新成功
        } catch (SQLException e) {
            e.printStackTrace();
            return false; // 更新操作失败
        }
    }
    
    /**
     * 执行简单SQL查询
     * @param sql SQL查询语句
     * @return ResultSet 查询结果集
     */
    public ResultSet query(String sql) {
        getconnection();//主动创建连接，保障代码正常执行。
        ResultSet resultSet;
        try {
            Statement statement = connection.createStatement();
            resultSet = statement.executeQuery(sql);
            if(!resultSet.next()){
                 closeConnection();
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }

        return resultSet;
    }
    
    /**
     * 执行带参数的SQL查询
     * @param sql SQL查询语句（含占位符?）
     * @param params 参数值
     * @return ResultSet 查询结果集
     */
    public ResultSet prepareQuery(String sql, Object... params) {
        getconnection();
        try {
            PreparedStatement preparedStatement = connection.prepareStatement(sql);

            for (int i = 0; i < params.length; i++) {
                preparedStatement.setObject(i + 1, params[i]);
            }

            return preparedStatement.executeQuery();
        } catch (SQLException e) {
            e.printStackTrace();
            return null; // or throw an exception
        }
    }

    /**
     * 关闭数据库连接
     */
    public void closeConnection(){
        try{
            if(connection!=null&&!connection.isClosed()) {
                connection.close();
            }
        } catch (SQLException e) {
            System.out.println("关闭失败！");
        }
    }

    /**
     * 创建预编译SQL语句对象
     * @param sql SQL语句
     * @return PreparedStatement 预编译语句对象
     * @throws SQLException 如果创建失败
     */
    public PreparedStatement prepareStatement(String sql) throws SQLException {
        if (connection == null || connection.isClosed()) {
            throw new IllegalStateException("Database connection is not initialized or closed");
        }
        return connection.prepareStatement(sql);
    }
}
